home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / sound / digitize.zip / RECORD.ASM < prev    next >
Assembly Source File  |  1987-03-28  |  6KB  |  490 lines

  1. COUNTR    EQU    72 ;16572 HZ
  2.  
  3. TCADRC    EQU    43H
  4. TCADRD    EQU    40H
  5.  
  6. TCMODE    EQU    34H
  7.  
  8. ;-------------------------------------------
  9.  
  10. STK    SEGMENT    STACK
  11.     DW    128 DUP (0)
  12. STK    ENDS
  13.  
  14. ;-------------------------------------------
  15.  
  16. CODE    SEGMENT    PARA
  17.     ASSUME    CS:CODE,DS:CODE,SS:STK
  18.     ASSUME    ES:NOTHING
  19.  
  20. ;-------------------------------------------
  21.  
  22. COMADRS    DW    3FEH
  23.     DW    2FEH
  24.     DW    3EEH
  25.     DW    2EEH
  26. COMADR    DW    0
  27. FILELEN    DW    0
  28. HANDLE    DW    0
  29. MSG1    DB    'Press a key to start '
  30.     DB    'and stop.',0DH,0AH,24H
  31. MSG2    DB    'Disk error',0DH,0AH,24H
  32. MSG3    DB    'COM port number not'
  33.     DB    ' valid',0DH,0AH,24H
  34. MSG4    DB    'Recording...',0DH,0AH,24H
  35. MSG5    DB    'End recording',0DH,0AH,24H
  36.  
  37. ;-------------------------------------------
  38.  
  39. START:
  40.  
  41.     CALL    PARSE
  42.  
  43. ;set DS and ES
  44.  
  45.     PUSH    CS
  46.     POP    DS
  47.     PUSH    CS
  48.     POP    ES
  49.  
  50. ;decide which COM port to use
  51.  
  52.     MOV    BL,FIRSTPARM
  53.     SUB    BL,31H
  54.     JNC    CHKCOMHI
  55. COMERR:    MOV    DX,OFFSET MSG3
  56.     MOV    AH,9
  57.     INT    21H
  58.     MOV    AX,4C01H
  59.     INT    21H
  60. CHKCOMHI: CMP    BL,3
  61.     JA    COMERR
  62.     SHL    BL,1
  63.     SUB    BH,BH
  64.     ADD    BX,OFFSET COMADRS
  65.     MOV    AX,[BX]
  66.     MOV    COMADR,AX
  67.  
  68. ;create the file
  69.  
  70.     MOV    DX,OFFSET SECONDPARM
  71.     MOV    CX,0
  72.     MOV    AX,3C00H
  73.     INT    21H
  74.     JNC    L1
  75.     JMP    DSKERR
  76. L1:    MOV    HANDLE,AX
  77.  
  78. ;substitute local keyboard interrupt routine
  79.  
  80.     MOV    AX,3509H
  81.     INT    21H
  82.     MOV    WORD PTR OLDKBINT,BX
  83.     MOV    WORD PTR OLDKBINT+2,ES
  84.  
  85.     MOV    DX,OFFSET KBINT
  86.     MOV    AX,2509H
  87.     INT    21H
  88.  
  89. ;delay 1 second
  90.  
  91.     MOV    AX,40H
  92.     MOV    ES,AX
  93.     MOV    BX,6CH
  94.     MOV    AX,ES:[BX]
  95.     MOV    CX,18
  96. DL1:    CMP    AX,ES:[BX]
  97.     JE    DL1
  98.     MOV    AX,ES:[BX]
  99.     LOOP    DL1
  100.     PUSH    DS
  101.     POP    ES
  102.  
  103. ;print the prompt
  104.  
  105.     MOV    DX,OFFSET MSG1
  106.     MOV    AH,9
  107.     INT    21H
  108.  
  109. ;wait for a complete keystroke
  110.  
  111.     STI
  112.     MOV    BP,0
  113. WFKS:    CMP    BP,2
  114.     JB    WFKS
  115.  
  116. ;display message
  117.  
  118.     MOV    DX,OFFSET MSG4
  119.     MOV    AH,9
  120.     INT    21H
  121.  
  122. ;get vector of timer current timer interrupt
  123.  
  124.     MOV    AX,3508H
  125.     INT    21H
  126.     MOV    WORD PTR OLDTMRINT,BX
  127.     MOV    WORD PTR OLDTMRINT+2,ES
  128.  
  129. ;mask timer interrupt
  130.  
  131.     IN    AL,21H
  132.     OR    AL,01H
  133.     OUT    21H,AL
  134.  
  135. ;plug in the local timer interrupt routine
  136.  
  137.     MOV    DX,OFFSET TIMERINT
  138.     MOV    AX,2508H
  139.     INT    21H
  140.  
  141. ;rev up timer
  142.  
  143.     MOV    AL,TCMODE
  144.     OUT    TCADRC,AL
  145.     MOV    AX,COUNTR
  146.     OUT    TCADRD,AL
  147.     MOV    AL,AH
  148.     OUT    TCADRD,AL
  149.  
  150. ;set DS
  151.  
  152.     ASSUME    DS:NOTHING
  153.     MOV    AX,HIMEM
  154.     MOV    DS,AX
  155.  
  156. ;initialize registers
  157.  
  158.     MOV    BP,0
  159.     MOV    BX,0
  160.     MOV    AH,0
  161.     MOV    DX,COMADR
  162.  
  163. ;unmask timer interrupt
  164.  
  165.     IN    AL,21H
  166.     AND    AL,0FEH
  167.     OUT    21H,AL
  168.     STI
  169.  
  170. ;test for done
  171.  
  172. TFD:
  173.     OR    BP,BP
  174.     JE    TFD
  175.  
  176. ;save data length
  177.  
  178.     MOV    FILELEN,BX
  179.  
  180. ;mask timer interrupt
  181.  
  182.     CLI
  183.     IN    AL,21H
  184.     OR    AL,01H
  185.     OUT    21H,AL
  186.     STI
  187.  
  188. ;fix DS
  189.  
  190.     MOV    AX,CS
  191.     MOV    DS,AX
  192.     ASSUME    DS:CODE
  193.  
  194. ;fix timer
  195.  
  196.     MOV    AL,TCMODE
  197.     OUT    TCADRC,AL
  198.     MOV    AL,0
  199.     OUT    TCADRD,AL
  200.     OUT    TCADRD,AL
  201.  
  202. ;restore original timer interrupt vector
  203.  
  204.     PUSH    DS
  205.     LDS    DX,CS:OLDTMRINT
  206.     MOV    AX,2508H
  207.     INT    21H
  208.     POP    DS
  209.  
  210. ;unmask timer interrupt
  211.  
  212.     IN    AL,21H
  213.     AND    AL,0FEH
  214.     OUT    21H,AL
  215.  
  216. ;restore keyboard interrupt vector
  217.  
  218.     PUSH    DS
  219.     LDS    DX,CS:OLDKBINT
  220.     MOV    AX,2509H
  221.     INT    21H
  222.     POP    DS
  223.  
  224. ;display message
  225.  
  226.     MOV    DX,OFFSET MSG5
  227.     MOV    AH,9
  228.     INT    21H
  229.  
  230. ;figure out how long the system 18.2 Hz
  231. ; timer has been off
  232.  
  233.     MOV    AX,COUNTR
  234.     SHL    AX,1
  235.     SHL    AX,1
  236.     SHL    AX,1
  237.     MOV    CX,FILELEN
  238.     MUL    CX
  239.  
  240. ;adjust the BIOS time of day to catch up
  241.  
  242.     PUSH    ES
  243.     MOV    AX,40H
  244.     MOV    ES,AX
  245.     MOV    BX,6CH
  246.     CLI
  247.     ADD    ES:[BX],DX
  248.     ADC    WORD PTR ES:[BX+2],0
  249.     CMP    WORD PTR ES:[BX+2],18H
  250.     JB    BIOSFIXED
  251.     JA    WRAP
  252.     CMP    WORD PTR ES:[BX],0B0H
  253.     JB    BIOSFIXED
  254. WRAP:    SUB    WORD PTR ES:[BX],0B0H
  255.     SBB    WORD PTR ES:[BX+2],18H
  256. BIOSFIXED: STI
  257.     POP    ES
  258.  
  259. ;save the whole mess in the file
  260.  
  261.     MOV    AX,HIMEM
  262.     MOV    DS,AX
  263.  
  264.     ASSUME    DS:NOTHING
  265.  
  266.     MOV    BX,HANDLE
  267.     MOV    CX,FILELEN
  268.     MOV    AH,40H
  269.     MOV    DX,0
  270.     INT    21H
  271.     JC    DSKERR
  272.  
  273.     MOV    AH,3EH
  274.     INT    21H
  275.  
  276. ;clean up & exit
  277.  
  278.     CALL    FLUSHKB
  279.     MOV    AX,4C00H
  280.     INT    21H
  281.  
  282. ;disk error message exit
  283.  
  284. DSKERR:
  285.     MOV    AX,CS
  286.     MOV    DS,AX
  287.     MOV    DX,OFFSET MSG2
  288.     MOV    AH,9
  289.     INT    21H
  290.     CALL    FLUSHKB
  291.     MOV    AX,4C01H
  292.     INT    21H
  293.  
  294. ;-------------------------------------------
  295.  
  296. ;flush the keyboard buffer
  297.  
  298. FLUSHKB    PROC
  299.  
  300.     MOV    AH,1
  301.     INT    16H
  302.     JZ    FLUSHKB1
  303.     MOV    AH,0
  304.     INT    16H
  305.     JMP    FLUSHKB
  306. FLUSHKB1: RET
  307.  
  308. FLUSHKB    ENDP
  309.  
  310. ;-------------------------------------------
  311.  
  312. ;timer interrupt routine
  313.  
  314.     ASSUME    DS:NOTHING,ES:NOTHING
  315.     ASSUME    SS:NOTHING
  316.  
  317.     EVEN
  318.  
  319. OLDTMRINT DD    0
  320.  
  321. TIMERINT PROC    FAR
  322.  
  323.     OR    BP,BP
  324.     JNZ    TMRINT1
  325.  
  326.     IN    AL,DX
  327.  
  328.     MOV    CL,4
  329.     RCL    AL,CL
  330.     RCL    CH,1
  331.  
  332.     INC    AH
  333.     CMP    AH,8
  334.     JNE    TMRINT1
  335.     SUB    AH,AH
  336.  
  337.     MOV    [BX],CH
  338.  
  339.     INC    BX
  340.     OR    BX,BX
  341.     JNZ    TMRINT1
  342.     INC    BP
  343.  
  344. TMRINT1:
  345.     MOV    AL,20H
  346.     OUT    20H,AL
  347.     IRET
  348.  
  349. TIMERINT ENDP
  350.  
  351. ;-------------------------------------------
  352.  
  353. ;keyboard interrupt routine
  354.  
  355.     ASSUME    DS:NOTHING,ES:NOTHING
  356.     ASSUME    SS:NOTHING
  357.  
  358.     EVEN
  359.  
  360. OLDKBINT DD    0
  361.  
  362. KBINT    PROC    FAR
  363.  
  364.     INC    BP
  365.  
  366.     JMP    CS:OLDKBINT
  367.  
  368. KBINT    ENDP
  369.  
  370. ;-------------------------------------------
  371.  
  372. FIRSTPARM    DB    128 DUP (0)
  373. SECONDPARM    DB    128 DUP (0)
  374.  
  375. SPECERRMSG    DB    'File specification'
  376.     DB    ' error',0DH,0AH,24H
  377.  
  378. ;it is assumed that DS and ES both point
  379. ; to the PSP.
  380.  
  381. PARSE    PROC
  382.  
  383.     CLD
  384.     MOV    DI,80H
  385.     MOV    CL,[DI]
  386.     SUB    CH,CH
  387.     INC    DI
  388.  
  389. ;find first non-blank character
  390.  
  391.     MOV    AL,20H
  392.     REPE    SCASB
  393.     JNE    PARS2
  394.     PUSH    CS
  395.     POP    DS
  396.     MOV    DX,OFFSET SPECERRMSG
  397.     MOV    AH,9
  398.     INT    21H
  399.     MOV    AX,4C01H
  400.     INT    21H
  401.  
  402. ;find next blank character
  403.  
  404. PARS2:
  405.     DEC    DI
  406.     INC    CX
  407.     MOV    BX,DI
  408.     REPNE    SCASB
  409.     JE    PARS3
  410.     PUSH    CS
  411.     POP    DS
  412.     MOV    DX,OFFSET SPECERRMSG
  413.     MOV    AH,9
  414.     INT    21H
  415.     MOV    AX,4C01H
  416.     INT    21H
  417.  
  418. ;save first filename
  419.  
  420. PARS3:
  421.     DEC    DI
  422.     INC    CX
  423.     PUSH    CX
  424.     PUSH    DI
  425.     PUSH    ES
  426.     PUSH    CS
  427.     POP    ES
  428.     MOV    CX,DI
  429.     SUB    CX,BX
  430.     MOV    SI,BX
  431.     MOV    DI,OFFSET FIRSTPARM
  432.     REP    MOVSB
  433.     POP    ES
  434.     POP    DI
  435.     POP    CX
  436.  
  437. ;find next non-blank character
  438.  
  439.     MOV    AL,20H
  440.     REPE    SCASB
  441.     JNE    PARS4
  442.     PUSH    CS
  443.     POP    DS
  444.     MOV    DX,OFFSET SPECERRMSG
  445.     MOV    AH,9
  446.     INT    21H
  447.     MOV    AX,4C01H
  448.     INT    21H
  449.  
  450. ;find next blank character or end
  451.  
  452. PARS4:
  453.     DEC    DI
  454.     INC    CX
  455.     MOV    BX,DI
  456.     REPNE    SCASB
  457.  
  458. ;save second filename
  459.  
  460.     JCXZ    PARS5
  461.     DEC    DI
  462. PARS5:    PUSH    CX
  463.     PUSH    DI
  464.     PUSH    ES
  465.     PUSH    CS
  466.     POP    ES
  467.     MOV    CX,DI
  468.     SUB    CX,BX
  469.     MOV    SI,BX
  470.     MOV    DI,OFFSET SECONDPARM
  471.     REP    MOVSB
  472.     POP    ES
  473.     POP    DI
  474.     POP    CX
  475.  
  476.     RET
  477.  
  478. PARSE    ENDP
  479.  
  480. ;-------------------------------------------
  481.  
  482. CODE    ENDS
  483.  
  484. ;-------------------------------------------
  485.  
  486. HIMEM    SEGMENT    PARA
  487. HIMEM    ENDS
  488.  
  489.     END    START
  490.